package br.com.mftc.efitness.dados;

import java.lang.reflect.ParameterizedType;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;

import br.com.mftc.efitness.util.Parametros;

public class DadosGenerico<Entidade> implements IDadosGenerico<Entidade> {

	private Class<Entidade> classe;
    
	private EntityManagerFactory factory;
    protected EntityManager manager;
    
    @SuppressWarnings("unchecked")
	public DadosGenerico() {
    	factory = Persistence.createEntityManagerFactory(Parametros.UNIDADE_DE_PERSISTENCIA);
        manager = factory.createEntityManager();

        ParameterizedType parameterizedType = (ParameterizedType) getClass().getGenericSuperclass();
        classe = (Class<Entidade>) parameterizedType.getActualTypeArguments()[0];
    }
    

    @Override
    public void iniciarTransacao() {
    	manager.getTransaction().begin();
    }

    @Override
    public void finalizarTransacao() {
    	if (manager.getTransaction() != null && manager.getTransaction().isActive()) {
    		manager.getTransaction().commit();
    		manager.clear();
    	}
    }

    @Override
    public void desfazerTransacao() {
    	if (manager.getTransaction() != null && manager.getTransaction().isActive()) {
        	manager.getTransaction().rollback();
            manager.clear();
        }
    }

    @Override
    public final void inserir(Entidade objeto) {
    	manager.persist(objeto);
    }

    @Override
    public final void alterar(Entidade objeto) {
    	manager.merge(objeto);
    }
    
    @Override
    public final void remover(Entidade objeto) {
    	manager.remove(manager.merge(objeto));
    }

    @Override
    public final Entidade consultarPorId(Long identificador) {
    	return manager.find(classe, identificador);
    }

    @Override
    public final List<Entidade> consultarTodos() {
    	manager.clear();
    	
    	TypedQuery<Entidade> query = manager.createQuery("FROM " + classe.getSimpleName(), classe);
        
        return query.getResultList();
    }
}
